import tkinter as tk
import random
import time

class ReactionTimer:
    def __init__(self, master):
        self.master = master
        self.master.title("反应速度测试")
        self.master.geometry("400x300")

        self.label = tk.Label(master, text="准备好了吗？", font=("Arial", 20))
        self.label.pack(expand=True)

        self.start_button = tk.Button(master, text="开始测试", command=self.start_test)
        self.start_button.pack(pady=20)

        self.master.configure(bg="gray")
        self.start_time = None
        self.color_ready = False  # 标志位，跟踪是否可以点击
        self.test_in_progress = False  # 标志位，跟踪测试是否进行中

        # 存储反应时间的列表
        self.reaction_times = []

        # 显示结果的标签
        self.result_label = tk.Label(master, text="", font=("Arial", 12), bg="gray")
        self.result_label.pack(side=tk.BOTTOM, anchor=tk.SE, padx=10, pady=10)

        # 绑定按钮点击事件
        self.master.bind("<Button-1>", self.handle_click)

    def start_test(self):
        self.label.config(text="准备...")
        self.master.configure(bg="gray")
        self.master.update()

        self.test_in_progress = True  # 测试进行中
        self.color_ready = False  # 重置为不可以点击

        # 随机等待1到3秒
        wait_time = random.randint(1, 3)
        self.master.after(wait_time * 1000, self.change_color)

    def change_color(self):
        if not self.test_in_progress:  # 如果测试已经结束，则不继续
            return

        self.label.config(text="点击它！")
        self.master.configure(bg=random.choice(["red", "green", "blue", "yellow", "purple"]))
        self.start_time = time.time()  # 记录开始时间
        self.color_ready = True  # 现在可以点击了

    def handle_click(self, event):
        if self.test_in_progress and not self.color_ready:  # 在测试进行中且未准备好（准备阶段点击）
            self.label.config(text="失败！请等待颜色变换再点击。")
            self.test_in_progress = False  # 测试结束
            self.color_ready = False  # 确保重置为不可以点击
            self.master.configure(bg="gray")  # 恢复背景色
            return  # 退出函数

        # 如果准备好可以点击
        if self.color_ready:
            reaction_time = time.time() - self.start_time
            self.label.config(text=f"反应时间: {reaction_time:.3f}秒")
            self.color_ready = False  # 重置准备状态
            self.test_in_progress = False  # 测试结束

            # 记录反应时间
            self.reaction_times.append(reaction_time)
            self.update_results()

    def update_results(self):
        # 保持最后5个反应时间
        if len(self.reaction_times) > 5:
            self.reaction_times.pop(0)  # 移除最旧的反应时间

        # 计算平均时间
        average_time = sum(self.reaction_times) / len(self.reaction_times)

        # 更新结果标签
        result_text = "最近反应时间:\n" + "\n".join([f"{t:.3f}秒" for t in self.reaction_times])
        result_text += f"\n平均反应时间: {average_time:.3f}秒"
        self.result_label.config(text=result_text)

if __name__ == "__main__":
    root = tk.Tk()
    app = ReactionTimer(root)
    root.mainloop()
